Перейти к основному содержимому

Введение в массивы и строки

Что такое массив

Массив — это набор переменных одного типа, хранящихся в памяти подряд. Как ящик с пронумерованными отделениями.

int numbers[5];  // Массив из 5 целых чисел
numbers[0] = 10; // Первый элемент (индекс 0)
numbers[1] = 20; // Второй элемент (индекс 1)

Объявление массивов

Основные способы

#include <stdio.h>

int main() {
int scores[3]; // Массив из 3 элементов

// Присваиваем значения по отдельности
scores[0] = 85;
scores[1] = 92;
scores[2] = 78;

printf("Результаты тестов:\n");
printf("Тест 1: %d\n", scores[0]);
printf("Тест 2: %d\n", scores[1]);
printf("Тест 3: %d\n", scores[2]);

return 0;
}

Работа с массивами

Заполнение и обход

#include <stdio.h>

int main() {
int numbers[5];

// Заполняем массив
printf("Заполняем массив:\n");
for (int i = 0; i < 5; i++) {
numbers[i] = (i + 1) * 10; // 10, 20, 30, 40, 50
printf("numbers[%d] = %d\n", i, numbers[i]);
}

// Вычисляем сумму
int sum = 0;
for (int i = 0; i < 5; i++) {
sum += numbers[i];
}

printf("Сумма всех элементов: %d\n", sum); // 150

return 0;
}

Поиск в массиве

#include <stdio.h>

int main() {
int studentIds[] = {1001, 1005, 1012, 1008, 1003};
int size = 5;
int searchId = 1008;
int found = 0;
int position = -1;

printf("Поиск студента с ID: %d\n", searchId);

for (int i = 0; i < size; i++) {
printf("Проверяем позицию %d: ID = %d\n", i, studentIds[i]);

if (studentIds[i] == searchId) {
found = 1;
position = i;
break; // Нашли - выходим из цикла
}
}

if (found) {
printf("✅ Студент найден на позиции %d\n", position);
} else {
printf("❌ Студент не найден\n");
}

return 0;
}

Двумерные массивы

Массив массивов — таблица с строками и столбцами.

Объявление и инициализация

#include <stdio.h>

int main() {
// Таблица 3×4 (3 строки, 4 столбца)
int matrix[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};

printf("Матрица 3×4:\n");

for (int row = 0; row < 3; row++) {
for (int col = 0; col < 4; col++) {
printf("%3d ", matrix[row][col]);
}
printf("\n");
}

return 0;
}

Введение в строки

Строка — это массив символов, заканчивающийся нулевым символом '\0'.

Объявление строк

#include <stdio.h>

int main() {
// Способ 1: массив символов
char name[6] = {'А', 'н', 'н', 'а', '\0'};

// Способ 2: строковый литерал
char city[10] = "Москва";

// Способ 3: автоматический размер
char country[] = "Россия";

printf("Имя: %s\n", name);
printf("Город: %s\n", city);
printf("Страна: %s\n", country);

return 0;
}

Основные операции со строками

#include <stdio.h>

int main() {
char message[] = "Программирование";
int length = 0;

// Подсчет длины строки
while (message[length] != '\0') {
length++;
}

printf("Строка: %s\n", message);
printf("Длина: %d символов\n", length);

// Вывод символов по одному
printf("По символам: ");
for (int i = 0; i < length; i++) {
printf("'%c' ", message[i]);
}
printf("\n");

return 0;
}

Практические примеры

Анализ оценок класса

#include <stdio.h>

int main() {
int grades[10] = {85, 92, 78, 95, 88, 76, 94, 82, 90, 87};
int students = 10;

int sum = 0;
int excellent = 0; // Оценки >= 90
int good = 0; // Оценки 80-89
int satisfactory = 0; // Оценки 70-79

printf("Анализ успеваемости класса:\n");

for (int i = 0; i < students; i++) {
int grade = grades[i];
sum += grade;

printf("Студент %2d: %d баллов - ", i + 1, grade);

if (grade >= 90) {
printf("Отлично\n");
excellent++;
} else if (grade >= 80) {
printf("Хорошо\n");
good++;
} else if (grade >= 70) {
printf("Удовлетворительно\n");
satisfactory++;
} else {
printf("Неудовлетворительно\n");
}
}

float average = (float)sum / students;

printf("\n=== СТАТИСТИКА ===\n");
printf("Средний балл: %.1f\n", average);
printf("Отличников: %d\n", excellent);
printf("Хорошистов: %d\n", good);
printf("Троечников: %d\n", satisfactory);

return 0;
}

Работа с именами

#include <stdio.h>

int main() {
char names[3][20] = {
"Александр",
"Екатерина",
"Михаил"
};

int ages[3] = {25, 30, 28};

printf("=== СПИСОК СОТРУДНИКОВ ===\n");

for (int i = 0; i < 3; i++) {
printf("%d. %s - %d лет\n", i + 1, names[i], ages[i]);
}

// Поиск самого молодого
int youngestIndex = 0;
for (int i = 1; i < 3; i++) {
if (ages[i] < ages[youngestIndex]) {
youngestIndex = i;
}
}

printf("\nСамый молодой сотрудник: %s (%d лет)\n",
names[youngestIndex], ages[youngestIndex]);

return 0;
}

Простые алгоритмы

Сортировка пузырьком (упрощенно)

#include <stdio.h>

int main() {
int numbers[] = {64, 34, 25, 12, 22};
int size = 5;

printf("Исходный массив: ");
for (int i = 0; i < size; i++) {
printf("%d ", numbers[i]);
}
printf("\n");

// Простая сортировка
for (int i = 0; i < size - 1; i++) {
for (int j = 0; j < size - 1 - i; j++) {
if (numbers[j] > numbers[j + 1]) {
// Меняем местами
int temp = numbers[j];
numbers[j] = numbers[j + 1];
numbers[j + 1] = temp;
}
}
}

printf("Отсортированный: ");
for (int i = 0; i < size; i++) {
printf("%d ", numbers[i]);
}
printf("\n");

return 0;
}

Подсчет символов в строке

#include <stdio.h>

int main() {
char text[] = "Hello World 2025!";
int letters = 0, digits = 0, spaces = 0, others = 0;

printf("Анализируем: \"%s\"\n", text);

for (int i = 0; text[i] != '\0'; i++) {
char ch = text[i];

if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z')) {
letters++;
} else if (ch >= '0' && ch <= '9') {
digits++;
} else if (ch == ' ') {
spaces++;
} else {
others++;
}
}

printf("📊 Статистика:\n");
printf("Букв: %d\n", letters);
printf("Цифр: %d\n", digits);
printf("Пробелов: %d\n", spaces);
printf("Других символов: %d\n", others);

return 0;
}

Размер массива

Определение размера

#include <stdio.h>

int main() {
int temperatures[] = {18, 22, 25, 19, 16};

// Вычисляем размер массива
int size = sizeof(temperatures) / sizeof(temperatures[0]);

printf("Размер массива: %d элементов\n", size);
printf("Температуры:\n");

for (int i = 0; i < size; i++) {
printf("День %d: %d°C\n", i + 1, temperatures[i]);
}

return 0;
}

Практические задачи с массивами

Статистика продаж

#include <stdio.h>

int main() {
int sales[7] = {150, 200, 180, 220, 175, 300, 250}; // Продажи по дням
char days[][12] = {"Понедельник", "Вторник", "Среда", "Четверг",
"Пятница", "Суббота", "Воскресенье"};

int total = 0;
int maxSales = sales[0];
int maxDay = 0;

printf("=== ОТЧЕТ О ПРОДАЖАХ ===\n");

for (int i = 0; i < 7; i++) {
printf("%s: %d продаж\n", days[i], sales[i]);

total += sales[i];

if (sales[i] > maxSales) {
maxSales = sales[i];
maxDay = i;
}
}

float average = (float)total / 7;

printf("\n=== ИТОГИ ===\n");
printf("Общие продажи: %d\n", total);
printf("Среднее за день: %.1f\n", average);
printf("Лучший день: %s (%d продаж)\n", days[maxDay], maxSales);

return 0;
}

Поиск и сортировка

#include <stdio.h>

int main() {
int products[] = {101, 205, 308, 412, 506, 609};
int size = 6;
int searchCode = 308;

printf("Поиск товара с кодом: %d\n", searchCode);

for (int i = 0; i < size; i++) {
printf("Проверяем позицию %d: код %d\n", i, products[i]);

if (products[i] == searchCode) {
printf("✅ Товар найден на позиции %d\n", i);
printf("📦 Код товара: %d\n", products[i]);
break;
}
}

return 0;
}

Основы работы со строками

Создание и вывод строк

#include <stdio.h>

int main() {
char greeting[] = "Добро пожаловать!";
char username[50] = "Пользователь";

printf("%s, %s\n", greeting, username);

// Изменение строки посимвольно
username[0] = 'п'; // Строчная буква
printf("Измененное: %s\n", username); // пользователь

return 0;
}

Длина строки

#include <stdio.h>

int stringLength(char str[]) {
int length = 0;
while (str[length] != '\0') {
length++;
}
return length;
}

int main() {
char message[] = "Изучаем строки";

int len = stringLength(message);

printf("Строка: \"%s\"\n", message);
printf("Длина: %d символов\n", len);

// Обход строки
printf("Символы: ");
for (int i = 0; i < len; i++) {
printf("'%c' ", message[i]);
}
printf("\n");

return 0;
}

Копирование строк

#include <stdio.h>

void copyString(char destination[], char source[]) {
int i = 0;
while (source[i] != '\0') {
destination[i] = source[i];
i++;
}
destination[i] = '\0'; // Не забываем нулевой символ!
}

int main() {
char original[] = "Исходная строка";
char copy[50]; // Достаточно места для копии

copyString(copy, original);

printf("Оригинал: %s\n", original);
printf("Копия: %s\n", copy);

return 0;
}

Частые ошибки

Типичные проблемы
// ❌ Выход за границы массива
int arr[5];
arr[5] = 100; // Индекс 5 не существует! (есть только 0-4)

// ❌ Забыть нулевой символ в строке
char name[5] = {'А', 'н', 'н', 'а'}; // Нет '\0'!
printf("%s\n", name); // Непредсказуемый вывод

// ❌ Недостаточный размер для строки
char short_str[5] = "Длинная строка"; // Не поместится!

// ❌ Неинициализированный массив
int numbers[5];
for (int i = 0; i < 5; i++) {
printf("%d ", numbers[i]); // Случайные значения!
}
Важные правила
  • Индексы массивов начинаются с 0
  • Максимальный индекс = размер - 1
  • Строки всегда заканчиваются символом '\0'
  • При создании строки размер должен учитывать нулевой символ

Полезные приемы

Инициализация массива значением

#include <stdio.h>

int main() {
int scores[10];

// Заполняем все элементы нулями
for (int i = 0; i < 10; i++) {
scores[i] = 0;
}

// Проверяем результат
printf("Инициализированный массив: ");
for (int i = 0; i < 10; i++) {
printf("%d ", scores[i]);
}
printf("\n");

return 0;
}

Обращение массива

#include <stdio.h>

int main() {
int numbers[] = {1, 2, 3, 4, 5};
int size = 5;

printf("Исходный массив: ");
for (int i = 0; i < size; i++) {
printf("%d ", numbers[i]);
}
printf("\n");

// Обращаем массив
for (int i = 0; i < size / 2; i++) {
int temp = numbers[i];
numbers[i] = numbers[size - 1 - i];
numbers[size - 1 - i] = temp;
}

printf("Обращенный массив: ");
for (int i = 0; i < size; i++) {
printf("%d ", numbers[i]);
}
printf("\n");

return 0;
}
Лучшие практики
  • Всегда инициализируйте массивы перед использованием
  • Проверяйте границы при работе с индексами
  • Для строк резервируйте место под нулевой символ
  • Используйте константы для размеров массивов
  • При копировании строк убедитесь в достаточном размере приемника

Массивы и строки — фундаментальные структуры данных для хранения и обработки наборов информации.